ForEach only work on fixed size Arrays.
As soon as you start adding or removing elements you will get: index out of bounds exception.
To avoid this error you can wrap your Array inside a Class as shown below.
ContentView.swift
import SwiftUI
class WrapElements : ObservableObject {
@Published var elements = ["A","B","C"]
}
struct ContentView: View {
@ObservedObject var wrapElements = WrapElements()
var body:some View {
VStack{
ForEach(wrapElements.elements.indices, id: \.self){ index in
Text(self.wrapElements.elements[index])
}
}.onTapGesture{self.wrapElements.elements.removeLast()}
}
}
Without using Class wrapper you will get error as demonstrated with below example.
ContentView.swift
import SwiftUI
struct ContentView: View {
@State var elements = ["A","B","C"]
var body:some View {
VStack{
ForEach(elements.indices, id: \.self){ index in
Text(self.elements[index])
}
}.onTapGesture{self.elements.removeLast()}
}
}
Example 2
import SwiftUI
struct ContentView: View {
@State var elements = ["A","B","C"]
var body:some View {
VStack{
ForEach(elements.indices, id: \.self){ index in
Text(self.elements[index])
}
Button("ADD" ) {self.elements.append("D")}
Button("REMOVE") {self.elements.removeLast()}